package domain.aerolinea;

import java.util.ArrayList;
import java.util.List;

import com.oceanic.AerolineaOceanic;
import com.oceanic.AsientoDTO;

import domain.Asiento;
import domain.Usuario;
import domain.busqueda.ParametrosDeBusqueda;
import domain.excepciones.NoPudoComprarAsientoException;
import domain.excepciones.NoPudoReservarAsientoException;

public class AerolineaOceanicAdapter implements Aerolinea{
	
	@Override
	public List<Asiento> buscar(ParametrosDeBusqueda parametros) {
		List<AsientoDTO> asientos ;
		if(parametros.tieneSoloOrigen()){
			asientos = this.getOceanic().asientosDisponiblesParaOrigen(parametros.getOrigen(), parametros.getFechaDeSalida());
		}else{
			asientos = this.getOceanic().asientosDisponiblesParaOrigenYDestino(parametros.getOrigen(), parametros.getDestino(), parametros.getFechaDeSalida());
		}
		return this.tranformarEnAsientos(asientos);
	}

	protected List<Asiento> tranformarEnAsientos(List<AsientoDTO> asientosResultados) {
		List<Asiento> asientos = new ArrayList<Asiento>();
		for(AsientoDTO asientoDTO : asientosResultados){
			asientos.add(new Asiento(asientoDTO));
		}
		return asientos;
	}

	@Override
	public void comprar(Asiento asiento, Usuario usuario) {
		final Boolean pudoComprar = this.getOceanic().comprarSiHayDisponibilidad(usuario.getDni(), asiento.getVuelo(), asiento.getNumeroDeAsiento());

		if(!pudoComprar){
			throw new NoPudoComprarAsientoException(asiento,usuario,"Oceanic");
		}
	}


	@Override
	public void reservar(Asiento asiento, Usuario usuario) {
		final Boolean pudoReservar = this.getOceanic().reservar(usuario.getDni(), asiento.getVuelo(), asiento.getNumeroDeAsiento());

		if(!pudoReservar){
			throw new NoPudoReservarAsientoException(asiento,usuario,"Oceanic");
		}
	}

	protected AerolineaOceanic getOceanic() {
		return AerolineaOceanic.getInstance();
	}
}
